package com.xsg.printer.core;

import com.xsg.printer.core.enums.VoucherEnum;
import com.xsg.printer.core.exception.VoucherPrintException;
import com.xsg.printer.core.model.XsgDiv;
import com.xsg.printer.core.model.XsgElement;
import com.xsg.printer.core.model.XsgTemplate;
import com.xsg.printer.core.toolkit.MapUtil;
import org.apache.commons.lang.StringUtils;

import java.util.List;
import java.util.Map;

/**
 * 模板绘制处理器
 */
public class TemplateDrawHandler {

    public static TemplateDrawHandler getInstance() {
        return new TemplateDrawHandler();
    }

    /**
     * 绘制模板
     * @param template
     *              - 模板
     * @param voucherEnum
     *              - 面单类型
     * @param param
     *              - 参数
     * @return
     */
    public String draw(XsgTemplate template, VoucherEnum voucherEnum, Object param) {
        if (template == null) {
            throw new VoucherPrintException("打印模板为空");
        }
        if (voucherEnum == null) {
            throw new VoucherPrintException("打印的结果类型为空");
        }
        //填充动态数据
        setElementValue(template, param);
        //创建画板
        VoucherBoard voucherBoard = VoucherBoardFactory.createBoard(template.getHeight(), template.getWidth(), template.getColor(), voucherEnum);
        //获取画笔
        VoucherPaint paint = voucherBoard.getPaint();
        //开始绘制模板
        paint.drawTemplate(template);
        return voucherBoard.getResult();
    }

    /**
     * 填充动态数据
     * @param template
     * @param param
     */
    private void setElementValue(XsgTemplate template, Object param) {
        if (param == null) {
            return;
        }
        Map<String, Object> paramMap = MapUtil.objectToMap(param);
        setRowCellElementsValue(template.getDivs(), paramMap);
    }

    /**
     * 将主数据填充至模版显示元素当中
     * @param divs
     * @param paramMap
     */
    private static void setRowCellElementsValue(List<XsgDiv> divs, Map<String, Object> paramMap) {
        if (divs == null || divs.isEmpty()) {
            return;
        }
        //行
        for (XsgDiv div : divs) {
            List<XsgElement> elements= div.getElements();
            if (elements != null && !elements.isEmpty()) {
                for (XsgElement element : elements) {
                    if (element != null && !StringUtils.isEmpty(element.getName())) {
                        Object value = paramMap.get(element.getName());
                        if (value != null) {
                            element.setValue(value);
                        } else {
                            element.setValue(value);
                        }
                    }
                }
            }
            if (div.getDivs() != null && !div.getDivs().isEmpty()) {
                setRowCellElementsValue(div.getDivs(), paramMap);
            }
        }
    }

}
